#
#   Python GUI - File selection dialogs - Gtk
#

import os
import gtk
from GUI.Files import FileRef
from GUI.Alerts import confirm
from GUI import application

#------------------------------------------------------------------

class _FileDialog(gtk.FileChooserDialog):

    def __init__(self, ok_label, **kwds):
        gtk.FileChooserDialog.__init__(self, **kwds)
        self.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT)
        self.add_button(ok_label, gtk.RESPONSE_ACCEPT)
        self.connect('response', self.response)
        self.set_default_size(600, 600)
        self.set_position(gtk.WIN_POS_CENTER)

    def add_file_type(self, file_type):
        suffix = file_type.suffix
        if suffix:
            filter = gtk.FileFilter()
            name = file_type.name
            if name:
                filter.set_name(name)
            filter.add_pattern("*.%s" % suffix)
            self.add_filter(filter)

    def present_modally(self):
        return self.run() == gtk.RESPONSE_ACCEPT

    def response(self, _, id):
        #print "_FileDialog.response:", id ###
        if id == gtk.RESPONSE_ACCEPT:
            if not self.check():
                self.stop_emission('response')
    
    def check(self):
        return True

#------------------------------------------------------------------

class _SaveFileDialog(_FileDialog):
    
    def check(self):
        path = self.get_filename()
        #print "_SaveFileDialog.ok: checking path %r" % path ###
        #if path is None:
        #	return False
        if not os.path.exists(path):
            return True
        else:
            result = confirm("Replace existing '%s'?" % os.path.basename(path),
                "Cancel", "Replace", cancel = None)
            return result == 0

#------------------------------------------------------------------

def _request_old(prompt, default_dir, file_types, dir, multiple):

    if prompt.endswith(":"):
        prompt = prompt[:-1]
    if dir:
        action = gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER
    else:
        action = gtk.FILE_CHOOSER_ACTION_OPEN
    dlog = _FileDialog(title = prompt, action = action,
        ok_label = gtk.STOCK_OPEN)
    dlog.set_select_multiple(multiple)
    if file_types:
        for file_type in file_types:
            dlog.add_file_type(file_type)
    if default_dir:
        dlog.set_current_folder(default_dir.path)
    if dlog.present_modally():
        if multiple:
            result = [FileRef(path = path) for path in dlog.get_filenames()]
        else:
            result = FileRef(path = dlog.get_filename())
    else:
        result = None
    dlog.destroy()
    return result

#------------------------------------------------------------------

#def request_old_file(prompt = "Open File", default_dir = None,
#		file_types = None, multiple = False):
#	"""Present a dialog for selecting an existing file or set of files.
#	Returns a FileRef, or None if cancelled."""
#	
#	if prompt.endswith(":"):
#		prompt = prompt[:-1]
#	dlog = _FileDialog(title = prompt, ok_label = gtk.STOCK_OPEN)
#	dlog.set_select_multiple(multiple)
#	if file_types:
#		for file_type in file_types:
#			dlog.add_file_type(file_type)
#	if default_dir:
#		dlog.set_current_folder(default_dir.path)
#	if dlog.present_modally():
#		if multiple:
#			result = [FileRef(path = path) for path in dlog.get_filenames()]
#		else:
#			result = FileRef(path = dlog.get_filename())
#	else:
#		result = None
#	dlog.destroy()
#	return result
  
#------------------------------------------------------------------

#def request_old_directory(prompt = "Choose Folder", default_dir = None,
#		multiple = False):
#	"""Present a dialog for selecting an existing directory or set of directories.
#	Returns a DirRef, or None if cancelled."""
#	
#	if prompt.endswith(":"):
#		prompt = prompt[:-1]
#	dlog = _FileDialog(title = prompt, ok_label = gtk.STOCK_OPEN,
#		action = gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
#	dlog.set_select_multiple(multiple)
#	if default_dir:
#		dlog.set_current_folder(default_dir.path)
#	if dlog.present_modally():
#		if multiple:
#			result =  [DirRef(path = path) for path in dlog.get_filenames()]
#		else:
#			result = DirRef(path = dlog.get_filename())
#	else:
#		result = None
#	dlog.destroy()
#	return result

#------------------------------------------------------------------

def _request_new(prompt, default_dir, default_name, file_type, dir):
    if dir:
        action = gtk.FILE_CHOOSER_ACTION_CREATE_FOLDER
    else:
        action = gtk.FILE_CHOOSER_ACTION_SAVE
    if prompt.endswith(":"):
        prompt = prompt[:-1]
    dlog = _SaveFileDialog(title = prompt, action = action,
        ok_label = gtk.STOCK_SAVE)
    if file_type:
        dlog.add_file_type(file_type)
    if default_dir:
        dlog.set_current_folder(default_dir.path)
    if default_name:
        dlog.set_current_name(default_name)	
    if dlog.present_modally():
        path = dlog.get_filename()
        if file_type:
            path = file_type._add_suffix(path)
        result = FileRef(path = path)
    else:
        result = None
    dlog.destroy()
    return result

#------------------------------------------------------------------

#def request_new_file(prompt = "Save File", default_dir = None,
#		default_name = "", file_type = None):
#	"""Present a dialog requesting a name and location for a new file.
#	Returns a FileRef, or None if cancelled."""
#
#	if prompt.endswith(":"):
#		prompt = prompt[:-1]
#	dlog = _SaveFileDialog(title = prompt, ok_label = gtk.STOCK_SAVE,
#		action = gtk.FILE_CHOOSER_ACTION_SAVE)
#	if file_type:
#		dlog.add_file_type(file_type)
#	if default_dir:
#		dlog.set_current_folder(default_dir.path)
#	if default_name:
#		dlog.set_current_name(default_name)	
#	if dlog.present_modally():
#		path = dlog.get_filename()
#		if file_type:
#			path = file_type._add_suffix(path)
#		result = FileRef(path = path)
#	else:
#		result = None
#	dlog.destroy()
#	return result

#------------------------------------------------------------------

#def request_new_directory(prompt = "Create Folder", default_dir = None,
#		default_name = ""):
#	"""Present a dialog requesting a name and location for a new directory.
#	Returns a FileRef, or None if cancelled."""
#
#	if prompt.endswith(":"):
#		prompt = prompt[:-1]
#	dlog = _SaveFileDialog(title = prompt, ok_label = gtk.STOCK_SAVE,
#		action = gtk.FILE_CHOOSER_ACTION_CREATE_FOLDER)
#	if default_dir:
#		dlog.set_current_folder(default_dir.path)
#	if default_name:
#		dlog.set_current_name(default_name)	
#	if dlog.present_modally():
#		path = dlog.get_filename()
#		result = FileRef(path = path)
#	else:
#		result = None
#	dlog.destroy()
#	return result
